iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
生成式 AI

用AI寫程式也是要點本事的系列 第 17

FlutterWeb上的多執行序長得好奇怪喔

  • 分享至 

  • xImage
  •  

(這篇文是純粹經驗談。)

每種程式語言使用執行序的方式都不太一樣。

以Flutter來說,執行序設計上有兩種,一是函數名稱結尾多個「async」,另一個叫做「Isolate」。

像這樣的函數...程式碼中使用這個函數,就算是在使用「執行緒」。


  Future<void> checkSpeaking() async {
    
  }

一般函數呼叫時,都是「等執行完函數內容後,再繼續執行下一行程式碼。

但這種函數呼叫時,卻是「不等函數內容執行了,會另外開一條執行緒執行這個函數的內容。」

(寫Java寫習慣了的我,第一次看到Flutter這種設計時,渾身不自在啊!)

至於Isolate....嘿嘿!因為我的計畫是使用FlutterWeb,而不是Flutter(Android/iOS),所以不會使用到Isolate,因為FlutterWeb環境不支援這個。

它有Web專用的Isolate,但名稱不是Isolate。而且...連AI都不用它了,我這裡就無法多介紹了!

但如果回上一篇看,會發現「這裡使用執行緒是為了不停的檢查text to speech語音播放是否完成」,可是函數的內容是個一次性、不重複的結構,這要怎麼滿足這個目的?

再看一次程式碼,這次不只看函數,也看函數內容...


Future<void> checkSpeaking() async {
    await Future.delayed(Duration(milliseconds: 1000));
    if (_synthesis?.speaking??false) {
      // If _synthesis is still speaking, wait for a short delay and then check again
      checkSpeaking();
    } else if (_queue.isNotEmpty) {
      // If _synthesis is not speaking but there are still InputData objects in the queue, process the queue
      processQueue();
    } else {
      // If _synthesis is not speaking and the queue is empty, stop recording
      _recorder.stopRecording();
    }
  }

函數名稱叫「checkSpeaking」,裡面也有使用到一個同名稱的函數。
也就是說「在函數裡面自己呼叫自己」.....

「那這個函數何時會執行結束呢?」

因為這函數的內容同時也設計成「並不是這個函數每次執行時都會呼叫自己」,某些條件會呼叫、某些條件不會呼叫。
這個條件就是「text to speech是否播放完畢」。

同時,函數被呼叫執行當下,其實是「開一條執行序」,也就是說執行緒並不會長時間的用來執行這個「檢查text to speech播放的任務」,而是每次檢查、每次都開啟新的執行序。

(AI寫的,有事找他別找我。)


上一篇
FlutterWeb上的多執行序
下一篇
如何存檔
系列文
用AI寫程式也是要點本事的30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言